Pick up missing files from recent gbser commit.
authorrobertl <robertl>
Thu, 13 Jul 2006 21:25:24 +0000 (21:25 +0000)
committerrobertl <robertl>
Thu, 13 Jul 2006 21:25:24 +0000 (21:25 +0000)
gbser.c [new file with mode: 0644]
gbser_private.h [new file with mode: 0644]

diff --git a/gbser.c b/gbser.c
new file mode 100644 (file)
index 0000000..0daff0d
--- /dev/null
+++ b/gbser.c
@@ -0,0 +1,181 @@
+/*
+    Serial interface
+    
+    Copyright (C) 2006  Robert Lipe, robertlipe@usa.net
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#include "defs.h"
+#include "gbser.h"
+#include "gbser_private.h"
+
+#include <assert.h>
+#include <stdarg.h>
+
+void gbser__db(int l, const char *msg, ...) {
+    va_list ap;
+    va_start(ap, msg);
+    if (global_opts.debug_level >= l) {
+        vprintf(msg, ap);
+    }
+    va_end(ap);
+}
+
+/* Set the serial port speed.
+ */
+int gbser_set_speed(void *handle, unsigned speed) {
+    return gbser_set_port(handle, speed, 8, 0, 1);
+}
+
+static int parity_letter(char c) {
+    switch (c) {
+    case 'N': case 'n':
+        return 0;
+    case 'O': case 'o':
+        return 1;
+    case 'E': case 'e':
+        return 2;
+    default:
+        return -1;
+    }
+}
+
+/* Set the serial port up by parsing the supplied parameter string.
+ * Valid parameter strings look like '4800,8,N,1'. Parsing is case-
+ * insensitive, spaces are allowed around the commas and omitted
+ * trailing fields will default to '8', 'N' and '1'
+ */
+int gbser_setup(void *handle, const char *spec) {
+    unsigned arg[] = { 4800, 8, 0, 1 };
+    int ap;
+
+    for (ap = 0; ap < sizeof(arg) / sizeof(arg[0]); ap++) {
+        unsigned t = 0;
+        int pl;
+        while (isspace(*spec)) { spec++; }
+        /* Allow 'N', 'O' or 'E' as the parity spec */
+        if (ap == 2 && (pl = parity_letter(*spec), pl >= 0)) {
+            t = pl;
+            spec++;
+        } else {
+            if (!isdigit(*spec)) { break; }
+            while (isdigit(*spec)) { t = t * 10 + *spec++ - '0'; }
+        }
+        arg[ap] = t;
+        while (isspace(*spec)) { spec++; }
+        if (*spec != ',') { break; }
+        spec++;
+    }
+    
+    if (*spec != '\0') {
+        return gbser_ERROR;
+    }
+    
+    return gbser_set_port(handle, arg[0], arg[1], arg[2], arg[3]);
+}
+
+/* Return true if there are characters available on the serial port
+ */
+int gbser_avail(void *handle) {
+    return gbser__fill_buffer(handle, 1, NULL);
+}
+
+/* Read as many bytes as are available without blocking. At most |len|
+ * bytes will be read. Returns the number of bytes read or gbser_ERROR if an
+ * error occurs.
+ */
+int gbser_read(void *handle, void *buf, unsigned len) {
+       int got = 0;
+       
+       while (len > 0) {
+           int rc = gbser__fill_buffer(handle, len, NULL);
+           if (rc < 0) {
+               /* error */
+            return rc; 
+        } else if (rc == 0) {
+            /* nothing available */
+            break;
+        }
+        got += gbser__read_buffer(handle, &buf, &len);
+       }
+       
+       return got;
+}
+
+/* Read the specified number of bytes. Block until the requested number
+ * of bytes have been read or the timeout (in ms) is exceeded.
+ */
+int gbser_read_wait(void *handle, void *buf, unsigned len, unsigned ms) {
+       int got = 0;
+       
+       while (len > 0 && ms != 0) {
+           int rc;
+           if (rc = gbser__fill_buffer(handle, len, &ms), rc < 0) {
+            return rc; 
+        }
+        got += gbser__read_buffer(handle, &buf, &len);
+       }
+       
+       return got;
+}
+
+/* Read a single character from the port, returning immediately if
+ * none are available.
+ */
+int gbser_readc(void *handle) {
+    char buf;
+    int rc;
+    
+    rc = gbser_read(handle, &buf, 1);
+    if (rc > 0) {
+        return buf;
+    } else if (rc == 0) {
+        return gbser_NOTHING;
+    } else {
+        return gbser_ERROR;
+    }
+}
+
+/* Read a single character from the port, waiting up to |ms|
+ * milliseconds for a character to be available.
+ */
+int gbser_readc_wait(void *handle, unsigned ms) {
+    char buf;
+    int rc;
+    
+    rc = gbser_read_wait(handle, &buf, 1, ms);
+    if (rc > 0) {
+        return buf;
+    } else if (rc == 0) {
+        return gbser_NOTHING;
+    } else {
+        return gbser_ERROR;
+    }
+}
+
+/* Write a null terminated string in |str| to the serial
+ * port.
+ */
+int gbser_print(void *handle, const char *str) {
+    return gbser_write(handle, str, (unsigned) strlen(str));
+}
+
+/* Write a single character to the serial port.
+ */ 
+int gbser_writec(void *handle, int c) {
+    return gbser_write(handle, &c, 1);
+}
diff --git a/gbser_private.h b/gbser_private.h
new file mode 100644 (file)
index 0000000..318455e
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+    Serial interface - private header for gbser*.c
+    
+    Copyright (C) 2006  Robert Lipe, robertlipe@usa.net
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#define MYMAGIC 0x91827364
+#define BUFSIZE 512
+
+void gbser__db(int l, const char *msg, ...);
+int gbser__fill_buffer(void *h, unsigned want, unsigned *ms);
+unsigned gbser__read_buffer(void *handle, void **buf, unsigned *len);